Optimistic Concurrency Control (OCC) একটি কৌশল যা ডেটাবেসের একাধিক ব্যবহারকারী বা প্রক্রিয়া যখন একই রেকর্ডে একসাথে কাজ করে, তখন কনফ্লিক্ট বা প্রতিযোগিতা (race condition) থেকে বাঁচতে ব্যবহৃত হয়। এটি ডেটাবেসে ডেটা কনফ্লিক্টের সম্ভাবনা কমাতে সহায়তা করে।
Optimistic Concurrency বিশেষভাবে ব্যবহার করা হয় যখন আপনি মনে করেন যে, একাধিক ব্যবহারকারী একসাথে একই ডেটাতে কাজ করার সময় খুব কম কনফ্লিক্ট হবে। এর মধ্যে, ডেটাবেসে কোনও রেকর্ড আপডেট করার আগে, কোনো লকিং মেকানিজম ব্যবহৃত হয় না। পরিবর্তে, আপডেট করার সময় সেই রেকর্ডের আগের অবস্থা চেক করা হয় এবং যদি ডেটা পরিবর্তিত হয়ে থাকে, তাহলে Concurrency Exception ঘটানো হয়।
Optimistic Concurrency Control প্যাটার্নে মূলত তিনটি ধাপ থাকে:
ধরা যাক, আপনি একটি Student টেবিল পরিচালনা করছেন যেখানে প্রতিটি ছাত্রের জন্য একটি RowVersion কলাম রয়েছে। এই কলামটি ডেটাবেসে প্রতিটি রেকর্ডের সময় বা পরিবর্তন ট্র্যাক করতে ব্যবহৃত হয়।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[Timestamp] // This annotation marks the RowVersion column for concurrency checking
public byte[] RowVersion { get; set; }
}
এখানে:
RowVersion
একটি Timestamp কলাম যা সিস্টেম ডেটাবেসে প্রতিটি রেকর্ডের পরিবর্তনের সময় ট্র্যাক করে।public class ApplicationDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.Property(p => p.RowVersion)
.IsRowVersion(); // Configuring RowVersion for concurrency handling
}
}
এখানে:
IsRowVersion()
Fluent API দিয়ে RowVersion
কলামটি কনফিগার করা হয়েছে যাতে এটি কনকারেন্সি চেকিংয়ের জন্য ব্যবহৃত হয়।এখন, যদি দুজন ব্যবহারকারী একই সময়ে একই ছাত্রের ডেটা আপডেট করার চেষ্টা করে, তবে Optimistic Concurrency এ কনফ্লিক্ট হবে এবং Concurrency Exception ঘটবে। এই ধরনের কনফ্লিক্ট হ্যান্ডেল করতে হলে, কনফ্লিক্ট নির্ধারণের পরে অ্যাপ্লিকেশনটিকে সেই ডেটাকে পুনরায় লোড করে ব্যবহারকারীকে অবহিত করতে হবে, অথবা ব্যবহারকারীকে নতুন করে ডেটা আপডেট করার সুযোগ দিতে হবে।
try
{
var student = db.Students.FirstOrDefault(s => s.StudentId == 1);
student.Name = "Updated Name";
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
// Handle concurrency conflict
Console.WriteLine("Concurrency conflict detected! The record has been modified by someone else.");
}
এখানে:
DbUpdateConcurrencyException
এক ধরনের Exception যা সংঘটিত হয় যখন ডেটাবেসে একই রেকর্ড আপডেট করার জন্য দুই বা ততোধিক প্রক্রিয়া চেষ্টা করে।Entity Framework-এ Optimistic Concurrency কনফিগার করতে RowVersion
বা Timestamp কলাম ব্যবহার করা হয়। EF সঠিকভাবে Concurrency Conflict হ্যান্ডলিং করে এবং একাধিক ব্যবহারকারী একই রেকর্ড আপডেট করার সময় Optimistic Concurrency Exception ছুঁড়ে দেয়।
এটি Concurrency Control প্যাটার্ন হিসেবে কার্যকর এবং বিশেষ করে সিস্টেমে যেখানে রেকর্ডের আপডেট রেট কম, সেখানে ভালো ফল দেয়।
common.read_more